package GreedySnakeGame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;

/**
 * ==================================
 * 编码格式: UTF-8
 * 开发人员: acer
 * 开发工具: IntelliJ IDEA
 * 开发时间: 2020/7/11 0011 22:49
 * 项目名称: GreedySnake
 * 个人箴言: ”键盘敲烂，工资过万“
 * ==================================
 */
public class MainFrame extends JFrame {

    private Snake snake;    //蛇
    private Timer timer;    //定时器，在指定时间内调用蛇移动的方法
    private JPanel jPanel;  //游戏棋盘
    private Node food;      //食物

    public MainFrame() throws HeadlessException {
        initFrame();    //初始化窗体参数
        initGamePanel();    //初始化游戏棋盘
        initSnake();    //初始化蛇
        initFood();     //初始化食物
        initTimer();    //初始化定时器
        setKeyListener();   //设置键盘监听，让蛇随着上下左右方向移动
    }

    //初始化食物
    private void initFood() {
        food = new Node();
        food.random();
    }

    //设置键盘监听
    private void setKeyListener() {
        addKeyListener(new KeyAdapter() {   //当键盘按下时，会自动调用此方法
            @Override
            public void keyPressed(KeyEvent e) {
                // 修改蛇的运动方向
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_UP:    // 上键
                    case KeyEvent.VK_W:     // W键
                        if (snake.getDirection() != Direction.DOWN) {
                            snake.setDirection(Direction.UP);
                        }
                        break;
                    case KeyEvent.VK_DOWN:  // 下键
                    case KeyEvent.VK_S:     // S键
                        if (snake.getDirection() != Direction.UP) {
                            snake.setDirection(Direction.DOWN);
                        }
                        break;
                    case KeyEvent.VK_LEFT:  // 左键
                    case KeyEvent.VK_A:     // A键
                        if (snake.getDirection() != Direction.RIGHT) {
                            snake.setDirection(Direction.LEFT);
                        }
                        break;
                    case KeyEvent.VK_RIGHT: // 右键
                    case KeyEvent.VK_D:     // D键
                        if (snake.getDirection() != Direction.LEFT) {
                            snake.setDirection(Direction.RIGHT);
                        }
                        break;
                }
            }
        });
    }

    // 初始化定时器
    private void initTimer() {
        timer = new Timer();    // 创建定时器对象
        TimerTask timerTask = new TimerTask() { // 初始化定时任务
            @Override
            public void run() {
                snake.move();
                Node head = snake.getBody().getFirst();
                if(head.getX() == food.getX() && head.getY()==food.getY()){
                    snake.eat(food);
                    food.random();
                }
                jPanel.repaint();   // 重绘游戏棋盘
            }
        };
        timer.scheduleAtFixedRate(timerTask, 0, 150);   // 每100毫秒执行一次定时任务
    }


    private void initSnake() {
        snake = new Snake();
    }

    //初始化窗体参数
    private void initFrame() {
        setSize(606, 636);  // 设置窗体宽高
        setLocation(500, 250);  // 设置窗体位置
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭按钮的作用(退出程序)
        setResizable(false);    // 设置窗体大小不可变
    }

    //初始化游戏棋盘
    private void initGamePanel() {
        jPanel = new JPanel() {
            //绘制游戏棋盘中的内容
            @Override
            public void paint(Graphics graphics) {
                graphics.setColor(Color.LIGHT_GRAY);
                graphics.clearRect(0, 0, 606, 606); // 清空棋盘
                for (int i = 0; i < 41; i++) // 绘制40条横线
                    graphics.drawLine(0, i * 15, 600, i * 15);

                for (int i = 0; i < 41; i++) // 绘制40条竖线
                    graphics.drawLine(i * 15, 0, i * 15, 600);

                // 绘制蛇
                LinkedList<Node> body = snake.getBody();
                for (Node node : body) {
                    graphics.setColor(Color.GRAY);
                    graphics.fill3DRect(node.getX() * 15, node.getY() * 15, 15, 15, true);
                }
                graphics.setColor(Color.RED);
                graphics.fill3DRect(food.getX() * 15, food.getY() * 15, 15, 15, true);  // 绘制食物
            }
        };
        add(jPanel);    // 把棋盘添加到窗体中
    }

    public static void main(String[] args) {
        new MainFrame().setVisible(true);   // 创建窗体对象并显示
    }
}
